Initial Stuff

Load in Initial Processing file (and dependencies)

source("InitialProcessing.R")
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ dplyr   1.0.7
✓ tidyr   1.1.4     ✓ stringr 1.4.0
✓ readr   2.0.0     ✓ forcats 0.5.1
── Conflicts ─────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
New names:
* `` -> ...1
Rows: 73325 Columns: 97
── Column specification ─────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr  (1): ...1
dbl (96): 3-1-B-0-2_R1_filt.fastq.gz, 3-1-B-1-2_R1_filt.fastq.gz, 3-1-B-180_R1_filt.fastq.gz, 3-1-B-2...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
New names:
* `` -> ...1
Rows: 73325 Columns: 7
── Column specification ─────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (7): ...1, Kingdom, Phylum, Class, Order, Family, Genus

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Rows: 192 Columns: 16
── Column specification ─────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (13): Files, ID, Sample, Depth, Type, Paths, RenFiles, RenPaths, TrimmedFiles, TrimmedPaths, Filt...
dbl  (3): ReadDir, Station, Size

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Rows: 91 Columns: 7
── Column specification ─────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Depth
dbl (6): Station, Size_Class, Bin_Size, DNAperLiter, MassperLiter, ParticlesPerLiter

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Rows: 96 Columns: 5
── Column specification ─────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): ID, Depth, Flag
dbl (2): Station, Size_Class

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
extract_numeric() is deprecated: please use readr::parse_number() instead
Joining, by = "TagLevel"
`summarise()` has grouped output by 'ID'. You can override using the `.groups` argument.
Warning: Removed 15 rows containing missing values (position_stack).
`summarise()` has grouped output by 'nASV'. You can override using the `.groups` argument.
Rows: 9 Columns: 7
── Column specification ─────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Station
dbl (6): lat, long, UTMX, UTMY, depth, do

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
source("ChesapeakePersonalLibrary.R")

Cells/mg of particle

# my_sizes <- sort(unique(microbialAbundance$Size_Class))
# my_sizes
# scientific_10_c <- function(x) {
#     xout <- gsub("1e", "10^{", format(x),fixed=TRUE)
#     xout <- gsub("{-0", "{-", xout,fixed=TRUE)
#     xout <- gsub("{+", "{", xout,fixed=TRUE)
#     xout <- gsub("{0", "{", xout,fixed=TRUE)
#     xout <- paste(xout,"}",sep="")
#     return(parse(text=xout))
#     
# }
# 
# scale_y_log10nice <- function(name=NULL,omag=seq(-10,20),...) {
#     breaks10 <- 10^omag
#     scale_y_log10(breaks=breaks10,labels=scientific_10_c(breaks10),...)
# } # Reclocated to ChesapeakePersonalLibrary.R
abunPlot <- microbialAbundance %>% 
  filter(is.finite(MassperLiter)) %>%
  filter(Depth %in% c("Surface", "Bottom")) %>%
  mutate(copiesPerMg = copiesPerL / MassperLiter) %>%
  ggplot(aes(x = Size_Class, y = copiesPerMg, shape = as.factor(Station), fill = as.factor(Station))) +
  facet_wrap(~Depth, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Station))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice() +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  labs(y = "16s + 18s Genes / mg Particles", x = expression(paste("Particle Size (", mu, "m)"))) +
  theme(legend.position = "none",
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = 0))
abunPlot

PPLPlot <- microbialAbundance %>%
  filter(Size_Class >= 1) %>%
  filter(Depth %in% c("Surface", "Bottom")) %>%
  ggplot(aes(x = Size_Class, y = ParticlesPerLiter, shape = as.factor(Station), fill = as.factor(Station))) +
  facet_wrap(~Depth, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Station))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice(omag=seq(-10,20, by = 2)) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  labs(y = "Particles/L/mm", x = expression(paste("Particle Size (", mu, "m)"))) +
  theme(legend.position = "none",
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = 0))
PPLPlot

ParticleMassPlot <- microbialAbundance %>%
  filter(Size_Class >= 1) %>%
  filter(Depth %in% c("Surface", "Bottom")) %>%
  ggplot(aes(x = Size_Class, y = MassperLiter/ParticlesPerLiter, shape = as.factor(Station), fill = as.factor(Station))) +
  facet_wrap(~Depth, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Station))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  labs(y = "Dry Mass (mg) / Particle", x = expression(paste("Particle Size (", mu, "m)"))) +
  theme(legend.position = "none",
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = .5))
ParticleMassPlot

Ibid but combined with data about particles and the CB map

I need to load over data from the CB-Bay project

source("CBMap.R")
Rows: 9 Columns: 7
── Column specification ─────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Station
dbl (6): lat, long, UTMX, UTMY, depth, do

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
library(cowplot)
library(grid)
library(gridExtra)

Attaching package: ‘gridExtra’

The following object is masked from ‘package:dplyr’:

    combine
x.grob <- textGrob(expression(paste("Particle Size (", mu, "m)")), 
                   gp=gpar(fontsize=16))
combinedPlot <- plot_grid(PPLPlot, ParticleMassPlot, abunPlot, nrow = 1, labels = c("B", "C", "D"))
meta2 <- grid.arrange(arrangeGrob(combinedPlot, bottom = x.grob))

cbMap

physical_particles <- plot_grid(cbMap, meta2, rel_widths = c(1,3), labels = c("A", ""))
physical_particles

ggsave("PhysicalParticles.png", physical_particles, height = 4, width = 8)

Examplar species plot

What are the most abundant ASVs from each cluster? Plot their abundance. Pick the prettiest few and plot

source("ClusteringCore.R")
hgroups_exemplars <- cutree(sclust, k = 10)
nonSpikes20C <- nonSpikes20 %>% left_join(
  tibble(ASV = names(hgroups_exemplars), cluster = hgroups_exemplars), by = "ASV")
ASVsToView <- nonSpikes20C %>%
  filter(Kingdom == "Bacteria") %>%
  group_by(ASV, cluster) %>%
  summarise(meanCopies = mean(copiesPerL)) %>%
  group_by(cluster) %>%
  summarize(topASV = ASV[which.max(meanCopies)])
`summarise()` has grouped output by 'ASV'. You can override using the `.groups` argument.
  
ASVsToView
nonSpikes20C %>% 
  right_join(ASVsToView, by = c("ASV" = "topASV", "cluster")) %>%
  group_by(ASV) %>%
  slice_head()
nonSpikes20C %>%
  right_join(ASVsToView, by = c("ASV" = "topASV", "cluster" = "cluster")) %>%
  filter(cluster <= 7, Depth %in% c("Surface", "Bottom"), !is.na(Depth)) %>%
  arrange(Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma")
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

Fig X. Copies per L

nonSpikes20C %>%
  right_join(ASVsToView, by = c("ASV" = "topASV", "cluster" = "cluster")) %>%
  filter(cluster <= 7, Depth %in% c("Surface", "Bottom"), !is.na(Depth)) %>%
  filter(!is.na(MassperLiter)) %>%
  arrange(Size_Class) %>%
  ggplot(aes(y = copiesPerL/MassperLiter, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma")
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

Fig X + 1. Copies per mg stuff. I don’t love these examples because there is a bunch of station to station ariance, and you never see things that like, always show up at large stations.

I wonder if I can find some good examples of consistantly large particle stuff or something.

What if

I look for things that have high positive slope coefficients between size and normalized copies per L. And select for high mean abundance and high slope. And use site as a random effect? Would be nice to have some things that are intermediately high though. Some sort of polynomial regression?

nest20 <- nonSpikes20 %>%
  select(ASV, Station:ParticlesPerLiter, copiesPerL) %>%
  mutate(Station = as.factor(Station)) %>%
  group_by(ASV) %>%
  nest()
TestSub <- nest20[[2]][[1]] %>% ungroup()
TestSub
library(lme4)
Loading required package: Matrix

Attaching package: ‘Matrix’

The following objects are masked from ‘package:tidyr’:

    expand, pack, unpack
library(broom)
library(broom.mixed)
lm(log(copiesPerL/Bin_Size) ~ log(Size_Class), data = TestSub) %>% tidy()
lmer(log(copiesPerL/Bin_Size) ~ log(Size_Class) + (Size_Class|Station) + (Size_Class|Depth) , data = TestSub %>% 
       mutate(as.factor(Station))) %>% AIC()
boundary (singular) fit: see ?isSingular
[1] 294.8901
lmer(log(copiesPerL/Bin_Size) ~ log(Size_Class) + (1|Station) + (1|Depth) , data = TestSub %>% 
       mutate(as.factor(Station))) %>% AIC() # Better
[1] 284.1189
modDf <- nest20 %>%
  mutate(mod = map(data, 
                   ~lmer(log((copiesPerL+1)/Bin_Size) ~ log(Size_Class) +
                           (Size_Class|Station) + (Size_Class|Depth), data = .)
  )
  )
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 147: ASV = "ASV_1502".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
ℹ The warning occurred in group 147: ASV = "ASV_1502".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 214: ASV = "ASV_186".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
ℹ The warning occurred in group 214: ASV = "ASV_186".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 230: ASV = "ASV_197".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
ℹ The warning occurred in group 230: ASV = "ASV_197".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 239: ASV = "ASV_2015".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
ℹ The warning occurred in group 239: ASV = "ASV_2015".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 275: ASV = "ASV_2299".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
ℹ The warning occurred in group 275: ASV = "ASV_2299".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 324: ASV = "ASV_280".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
ℹ The warning occurred in group 324: ASV = "ASV_280".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 419: ASV = "ASV_407".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
ℹ The warning occurred in group 419: ASV = "ASV_407".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge with max|grad| = 2.37793 (tol = 0.002, component 1)
ℹ The warning occurred in group 458: ASV = "ASV_468".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
ℹ The warning occurred in group 458: ASV = "ASV_468".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 478: ASV = "ASV_5".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
ℹ The warning occurred in group 478: ASV = "ASV_5".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 566: ASV = "ASV_657".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
ℹ The warning occurred in group 566: ASV = "ASV_657".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 595: ASV = "ASV_71".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
ℹ The warning occurred in group 595: ASV = "ASV_71".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge with max|grad| = 1.37981 (tol = 0.002, component 1)
ℹ The warning occurred in group 608: ASV = "ASV_730".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
ℹ The warning occurred in group 608: ASV = "ASV_730".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 635: ASV = "ASV_789".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
ℹ The warning occurred in group 635: ASV = "ASV_789".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 648: ASV = "ASV_817".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
ℹ The warning occurred in group 648: ASV = "ASV_817".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ unable to evaluate scaled gradient
ℹ The warning occurred in group 705: ASV = "ASV_94".
Warning: Problem with `mutate()` column `mod`.
ℹ `mod = map(...)`.
ℹ Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
ℹ The warning occurred in group 705: ASV = "ASV_94".
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
modDf01 <- modDf %>% 
  mutate(tidied = map(mod, tidy)) %>%
  unnest(tidied) %>%
  select(-data, -mod)
modDf02 <- modDf01 %>%
  filter(term == "log(Size_Class)") %>%
  select(ASV, estimate, std.error)
modDf02 %>%
  ggplot(aes(x = estimate)) + geom_histogram() +
  scale_x_continuous(breaks = seq(from = -4, to = 2, by = 1))
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

There are some things that are ore abundant in the large particles

So Many ASVs. How do I ID the ones I want?

I kind of want to look at average concentrations (or sums)

SlopesAndMeans <- nonSpikes20 %>%
  #filter(Kingdom == "Bacteria") %>%
  group_by(ASV) %>%
  summarise(meanCopies = mean(copiesPerL)) %>%
  left_join(modDf02, by = "ASV")
SlopesAndMeans %>% head()
SlopesAndMeans %>%
  filter(estimate >= 0) %>%
  ggplot(aes(x = estimate, y = meanCopies, label = ASV)) +
  geom_point() +
  geom_label_repel()
Warning: ggrepel: 1 unlabeled data points (too many overlaps). Consider increasing max.overlaps

ASV 13 looks promising

taxa %>% 
  filter(ASV %in% c("ASV_13", "ASV_23", "ASV_58"))

The big stuff are all cyanos! Huh.

Targets <- SlopesAndMeans %>% filter(estimate > 0, meanCopies > 1e5) %>% pull(ASV)
taxa %>%
  filter(ASV %in% Targets)
Horses <- SlopesAndMeans %>% 
  left_join(taxa, by = "ASV") %>%
  filter(estimate > 0, meanCopies > 0e5) %>%
  arrange(-meanCopies)
Horses

Ok. Big stuff are cyanos and Planctomycetes, and apparently Spiders. Also apparently some proteos of different stripes. Rhodobacter are cool though.

nonSpikes20 %>%
  left_join(SlopesAndMeans, by = "ASV") %>%
  filter(estimate > 0, meanCopies > 1e5, Depth != "Oxy") %>%
  arrange(-meanCopies, Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90))
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

nonSpikes20 %>%
  left_join(SlopesAndMeans, by = "ASV") %>%
  filter(estimate > 0, meanCopies > 1e5, Depth != "Oxy") %>%
  arrange(-meanCopies, Size_Class) %>%
  filter(ASV == "ASV_7") %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90))
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

nonSpikes20 %>%
  left_join(SlopesAndMeans, by = "ASV") %>%
  filter(estimate > 0, meanCopies < 1e5, Depth != "Oxy") %>%
  arrange(-meanCopies, Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice() + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 2) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90))
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

Lets look at these!

I like, as examples Paracoccus (a Rhodobacter) -ASV_459 Synechococcus_CC9902 – ASV_23 SAR11_Clade – ASV_3

nonSpikes20 %>%
  filter(ASV %in% c("ASV_3", "ASV_23", "ASV_459"), Depth != "Oxy") %>%
  arrange(Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Station), shape = as.factor(Station))) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Depth ~ Tag) +
  geom_point(size = 3) +
  geom_path(aes(color = as.factor(Station))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_viridis_d(option = "plasma") +
  scale_color_viridis_d(option = "plasma") +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "none") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station")
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

Module abundance plot

hgroups_ants <- cutree(sclust, k = 50)
nonSpikes20A <- nonSpikes20 %>% left_join(
  tibble(ASV = names(hgroups_ants), cluster = hgroups_ants), by = "ASV")
# ASVsToView <- nonSpikes20A %>%
#   filter(Kingdom == "Bacteria") %>%
#   group_by(ASV, cluster) %>%
#   summarise(meanCopies = mean(copiesPerL)) %>%
#   group_by(cluster) %>%
#   summarize(topASV = ASV[which.max(meanCopies)])
  
ClusterSumsA <- nonSpikes20A %>%
  group_by(Station, Depth, cluster, Size_Class, Bin_Size) %>%
  summarise(copiesPerL = sum(copiesPerL))
`summarise()` has grouped output by 'Station', 'Depth', 'cluster', 'Size_Class'. You can override using the `.groups` argument.
HugeSurfacePlot <- nonSpikes20A %>%
  filter(Depth == "Surface") %>%
  arrange(Bin_Size) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class)) +
  facet_grid(cluster ~ Station) +
  scale_y_log10nice(omag = seq(-10, 20, by = 4)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  geom_path(alpha = 0.5, aes(group = ASV)) +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "none") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station") +
  geom_path(color = "red", data = ClusterSumsA %>% filter(Depth == "Surface")) # Add sums
ggsave("HugeSurfacePlot.pdf", HugeSurfacePlot, height = 72, width = 8, limitsize = FALSE)
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

I think we’re using “intercept” in the clustering information somehow. Which I don’t particularly want. But the clustering does happen by correlation. Super strange. Maybe the correlation isn’t the way I think it is?

MinimalSurfacePlot <- nonSpikes20A %>%
  filter(Depth == "Surface", cluster %in% c(1, 7, 15)) %>%
  arrange(Bin_Size) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class)) +
  facet_grid(cluster~ Station) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  geom_path(alpha = 0.5, aes(group = ASV)) +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "none") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station") +
  geom_path(color = "red", data = ClusterSumsA %>% filter(Depth == "Surface", cluster %in% c(1, 7, 15))) # Add sums
ggsave("MinimalSurfacePlot.pdf", MinimalSurfacePlot, height = 11, width = 8, limitsize = FALSE)
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis
MinimalSurfacePlot
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

MinimalClusterPlot <- nonSpikes20A %>%
  filter(Depth != "Oxy", cluster %in% c(1, 7, 15)) %>%
  arrange(Bin_Size) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class)) +
  facet_grid(cluster + Depth ~ Station) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  geom_path(alpha = 0.5, aes(group = ASV)) +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "none") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station") +
  geom_path(color = "red", data = ClusterSumsA %>% filter(Depth != "Oxy", cluster %in% c(1, 7, 15))) # Add sums
ggsave("MinimalClusterPlot.pdf", MinimalClusterPlot, height = 11, width = 8, limitsize = FALSE)
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

For sairah specifically

ExampleTaxa <- nonSpikes20 %>%
  filter(ASV %in% c("ASV_3", "ASV_23", "ASV_459")) %>%
  filter(Station %in% c("3.3", "4.3")) %>%
  mutate(Depth = recode(Depth, Oxy = "Oxycline")) %>%
  arrange(Size_Class) %>%
  ggplot(aes(y = copiesPerL/Bin_Size, x = Size_Class, fill = as.factor(Depth), shape = as.factor(Depth))) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) + scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  facet_grid(Station ~ Tag) +
  geom_point(size = 4) +
  geom_path(aes(color = as.factor(Depth))) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_manual(values = c("green", "blue", "black")) +
  scale_color_manual(values = c("green", "blue", "black")) +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 90), legend.position = "right") +
  labs(y = "16s Copies/L/mm", x = expression(paste("Particle Size (", mu, "m)")), fill = "Station", color = "Station", shape = "Station")
ExampleTaxa
Warning: Transformation introduced infinite values in continuous y-axis
Warning: Transformation introduced infinite values in continuous y-axis

Thing 2

abunPlot0 <- microbialAbundance %>% 
  filter(is.finite(MassperLiter)) %>%
  #filter(Depth %in% c("Surface", "Bottom")) %>%
  filter(Station %in% c(3.3, 4.3)) %>%
  mutate(Depth = recode(Depth, Oxy = "Oxycline")) %>%
  mutate(copiesPerMg = copiesPerL / MassperLiter) %>%
  ggplot(aes(x = Size_Class, y = copiesPerMg, shape = as.factor(Depth), fill = as.factor(Depth))) +
  facet_wrap(~Station, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Depth))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice() +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_manual(values = c("green", "blue", "black")) +
  scale_color_manual(values = c("green", "blue", "black")) +
  labs(y = "16s + 18s Genes / mg Particles", x = expression(paste("Particle Size (", mu, "m)")), color = "Depth", fill = "Depth", shape = "Depth") +
  theme(plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = 0))
SairahLegend <- get_legend(abunPlot0)
abunPlot <- abunPlot0 + theme(legend.position = "none")
#abunPlot
PPLPlot <- microbialAbundance %>%
  filter(Size_Class >= 1) %>%
  #filter(Depth %in% c("Surface", "Bottom")) %>%
  filter(Station %in% c(3.3, 4.3)) %>%
  ggplot(aes(x = Size_Class, y = ParticlesPerLiter, shape = as.factor(Depth), fill = as.factor(Depth))) +
  facet_wrap(~Station, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Depth))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice(omag=seq(-10,20, by = 2)) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_manual(values = c("green", "blue", "black")) +
  scale_color_manual(values = c("green", "blue", "black")) +
  labs(y = "Particles/L/mm", x = expression(paste("Particle Size (", mu, "m)"))) +
  theme(legend.position = "none",
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = 0))
#PPLPlot
ParticleMassPlot <- microbialAbundance %>%
  filter(Size_Class >= 1) %>%
  #filter(Depth %in% c("Surface", "Bottom")) %>%
  filter(Station %in% c(3.3, 4.3)) %>%
  ggplot(aes(x = Size_Class, y = MassperLiter/ParticlesPerLiter, shape = as.factor(Depth), fill = as.factor(Depth))) +
  facet_wrap(~Station, ncol = 1) +
  theme_bw(base_size = 16) +
  geom_point(size = 4) +
  #geom_path() + 
  geom_path(aes(color = as.factor(Depth))) +
  scale_x_log10(breaks = my_sizes, labels = as.character(my_sizes)) +
  scale_y_log10nice(omag = seq(-10, 20, by = 2)) +
  scale_shape_manual(values = rep(21:25, 2)) +
  scale_fill_manual(values = c("green", "blue", "black")) +
  scale_color_manual(values = c("green", "blue", "black")) +
  labs(y = "Dry Mass (mg) / Particle", x = expression(paste("Particle Size (", mu, "m)"))) +
  theme(legend.position = "none",
        plot.margin = unit(c(0, 0, 0, 0), "cm"),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90, vjust = .5),
        axis.title.y = element_text(margin = unit(c(0, 0, 0, 0), "mm"), vjust = .5))
#ParticleMassPlot
x.grob <- textGrob(expression(paste("Particle Size (", mu, "m)")), 
                   gp=gpar(fontsize=16))
combinedPlot <- plot_grid(PPLPlot, ParticleMassPlot, abunPlot, nrow = 1, labels = c("A", "B", "C"))
meta2 <- grid.arrange(arrangeGrob(combinedPlot, bottom = x.grob), right = SairahLegend)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBJbml0aWFsIFN0dWZmCgpMb2FkIGluIEluaXRpYWwgUHJvY2Vzc2luZyBmaWxlIChhbmQgZGVwZW5kZW5jaWVzKQoKYGBge3J9CnNvdXJjZSgiSW5pdGlhbFByb2Nlc3NpbmcuUiIpCnNvdXJjZSgiQ2hlc2FwZWFrZVBlcnNvbmFsTGlicmFyeS5SIikKYGBgCgoKIyBDZWxscy9tZyBvZiBwYXJ0aWNsZQoKYGBge3J9CiMgbXlfc2l6ZXMgPC0gc29ydCh1bmlxdWUobWljcm9iaWFsQWJ1bmRhbmNlJFNpemVfQ2xhc3MpKQojIG15X3NpemVzCmBgYAoKYGBge3J9CiMgc2NpZW50aWZpY18xMF9jIDwtIGZ1bmN0aW9uKHgpIHsKIyAgICAgeG91dCA8LSBnc3ViKCIxZSIsICIxMF57IiwgZm9ybWF0KHgpLGZpeGVkPVRSVUUpCiMgICAgIHhvdXQgPC0gZ3N1Yigiey0wIiwgInstIiwgeG91dCxmaXhlZD1UUlVFKQojICAgICB4b3V0IDwtIGdzdWIoInsrIiwgInsiLCB4b3V0LGZpeGVkPVRSVUUpCiMgICAgIHhvdXQgPC0gZ3N1YigiezAiLCAieyIsIHhvdXQsZml4ZWQ9VFJVRSkKIyAgICAgeG91dCA8LSBwYXN0ZSh4b3V0LCJ9IixzZXA9IiIpCiMgICAgIHJldHVybihwYXJzZSh0ZXh0PXhvdXQpKQojICAgICAKIyB9CiMgCiMgc2NhbGVfeV9sb2cxMG5pY2UgPC0gZnVuY3Rpb24obmFtZT1OVUxMLG9tYWc9c2VxKC0xMCwyMCksLi4uKSB7CiMgICAgIGJyZWFrczEwIDwtIDEwXm9tYWcKIyAgICAgc2NhbGVfeV9sb2cxMChicmVha3M9YnJlYWtzMTAsbGFiZWxzPXNjaWVudGlmaWNfMTBfYyhicmVha3MxMCksLi4uKQojIH0gIyBSZWNsb2NhdGVkIHRvIENoZXNhcGVha2VQZXJzb25hbExpYnJhcnkuUgpgYGAKCgpgYGB7cn0KYWJ1blBsb3QgPC0gbWljcm9iaWFsQWJ1bmRhbmNlICU+JSAKICBmaWx0ZXIoaXMuZmluaXRlKE1hc3NwZXJMaXRlcikpICU+JQogIGZpbHRlcihEZXB0aCAlaW4lIGMoIlN1cmZhY2UiLCAiQm90dG9tIikpICU+JQogIG11dGF0ZShjb3BpZXNQZXJNZyA9IGNvcGllc1BlckwgLyBNYXNzcGVyTGl0ZXIpICU+JQogIGdncGxvdChhZXMoeCA9IFNpemVfQ2xhc3MsIHkgPSBjb3BpZXNQZXJNZywgc2hhcGUgPSBhcy5mYWN0b3IoU3RhdGlvbiksIGZpbGwgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgZmFjZXRfd3JhcCh+RGVwdGgsIG5jb2wgPSAxKSArCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgI2dlb21fcGF0aCgpICsgCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IGFzLmZhY3RvcihTdGF0aW9uKSkpICsKICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgc2NhbGVfeV9sb2cxMG5pY2UoKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHJlcCgyMToyNSwgMikpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikgKwogIGxhYnMoeSA9ICIxNnMgKyAxOHMgR2VuZXMgLyBtZyBQYXJ0aWNsZXMiLCB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gLjUpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJtbSIpLCB2anVzdCA9IDApKQphYnVuUGxvdApgYGAKCmBgYHtyfQpQUExQbG90IDwtIG1pY3JvYmlhbEFidW5kYW5jZSAlPiUKICBmaWx0ZXIoU2l6ZV9DbGFzcyA+PSAxKSAlPiUKICBmaWx0ZXIoRGVwdGggJWluJSBjKCJTdXJmYWNlIiwgIkJvdHRvbSIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBTaXplX0NsYXNzLCB5ID0gUGFydGljbGVzUGVyTGl0ZXIsIHNoYXBlID0gYXMuZmFjdG9yKFN0YXRpb24pLCBmaWxsID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIGZhY2V0X3dyYXAofkRlcHRoLCBuY29sID0gMSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogICNnZW9tX3BhdGgoKSArIAogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIHNjYWxlX3lfbG9nMTBuaWNlKG9tYWc9c2VxKC0xMCwyMCwgYnkgPSAyKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBsYWJzKHkgPSAiUGFydGljbGVzL0wvbW0iLCB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gLjUpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJtbSIpLCB2anVzdCA9IDApKQpQUExQbG90CmBgYAoKYGBge3J9ClBhcnRpY2xlTWFzc1Bsb3QgPC0gbWljcm9iaWFsQWJ1bmRhbmNlICU+JQogIGZpbHRlcihTaXplX0NsYXNzID49IDEpICU+JQogIGZpbHRlcihEZXB0aCAlaW4lIGMoIlN1cmZhY2UiLCAiQm90dG9tIikpICU+JQogIGdncGxvdChhZXMoeCA9IFNpemVfQ2xhc3MsIHkgPSBNYXNzcGVyTGl0ZXIvUGFydGljbGVzUGVyTGl0ZXIsIHNoYXBlID0gYXMuZmFjdG9yKFN0YXRpb24pLCBmaWxsID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIGZhY2V0X3dyYXAofkRlcHRoLCBuY29sID0gMSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogICNnZW9tX3BhdGgoKSArIAogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIHNjYWxlX3lfbG9nMTBuaWNlKG9tYWcgPSBzZXEoLTEwLCAyMCwgYnkgPSAyKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBsYWJzKHkgPSAiRHJ5IE1hc3MgKG1nKSAvIFBhcnRpY2xlIiwgeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IC41KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAibW0iKSwgdmp1c3QgPSAuNSkpClBhcnRpY2xlTWFzc1Bsb3QKYGBgCgojIEliaWQgYnV0IGNvbWJpbmVkIHdpdGggZGF0YSBhYm91dCBwYXJ0aWNsZXMgYW5kIHRoZSBDQiBtYXAKSSBuZWVkIHRvIGxvYWQgb3ZlciBkYXRhIGZyb20gdGhlIENCLUJheSBwcm9qZWN0CgpgYGB7cn0Kc291cmNlKCJDQk1hcC5SIikKYGBgCgpgYGB7cn0KbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ3JpZEV4dHJhKQpgYGAKCmBgYHtyfQp4Lmdyb2IgPC0gdGV4dEdyb2IoZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSwgCiAgICAgICAgICAgICAgICAgICBncD1ncGFyKGZvbnRzaXplPTE2KSkKYGBgCgoKYGBge3IgZmlnLmhlaWdodCA9IDQsIGZpZy53aWR0aCA9IDExfQpjb21iaW5lZFBsb3QgPC0gcGxvdF9ncmlkKFBQTFBsb3QsIFBhcnRpY2xlTWFzc1Bsb3QsIGFidW5QbG90LCBucm93ID0gMSwgbGFiZWxzID0gYygiQiIsICJDIiwgIkQiKSkKYGBgCgpgYGB7cn0KbWV0YTIgPC0gZ3JpZC5hcnJhbmdlKGFycmFuZ2VHcm9iKGNvbWJpbmVkUGxvdCwgYm90dG9tID0geC5ncm9iKSkKYGBgCgpgYGB7cn0KY2JNYXAKYGBgCgoKYGBge3J9CnBoeXNpY2FsX3BhcnRpY2xlcyA8LSBwbG90X2dyaWQoY2JNYXAsIG1ldGEyLCByZWxfd2lkdGhzID0gYygxLDMpLCBsYWJlbHMgPSBjKCJBIiwgIiIpKQpwaHlzaWNhbF9wYXJ0aWNsZXMKYGBgCgpgYGB7cn0KZ2dzYXZlKCJQaHlzaWNhbFBhcnRpY2xlcy5wbmciLCBwaHlzaWNhbF9wYXJ0aWNsZXMsIGhlaWdodCA9IDQsIHdpZHRoID0gOCkKYGBgCgoKCiMgRXhhbXBsYXIgc3BlY2llcyBwbG90CgpXaGF0IGFyZSB0aGUgbW9zdCBhYnVuZGFudCBBU1ZzIGZyb20gZWFjaCBjbHVzdGVyPwpQbG90IHRoZWlyIGFidW5kYW5jZS4KUGljayB0aGUgcHJldHRpZXN0IGZldyBhbmQgcGxvdAoKYGBge3J9CnNvdXJjZSgiQ2x1c3RlcmluZ0NvcmUuUiIpCmBgYAoKCmBgYHtyfQpoZ3JvdXBzX2V4ZW1wbGFycyA8LSBjdXRyZWUoc2NsdXN0LCBrID0gMTApCmBgYAoKCmBgYHtyfQpub25TcGlrZXMyMEMgPC0gbm9uU3Bpa2VzMjAgJT4lIGxlZnRfam9pbigKICB0aWJibGUoQVNWID0gbmFtZXMoaGdyb3Vwc19leGVtcGxhcnMpLCBjbHVzdGVyID0gaGdyb3Vwc19leGVtcGxhcnMpLCBieSA9ICJBU1YiKQpBU1ZzVG9WaWV3IDwtIG5vblNwaWtlczIwQyAlPiUKICBmaWx0ZXIoS2luZ2RvbSA9PSAiQmFjdGVyaWEiKSAlPiUKICBncm91cF9ieShBU1YsIGNsdXN0ZXIpICU+JQogIHN1bW1hcmlzZShtZWFuQ29waWVzID0gbWVhbihjb3BpZXNQZXJMKSkgJT4lCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lCiAgc3VtbWFyaXplKHRvcEFTViA9IEFTVlt3aGljaC5tYXgobWVhbkNvcGllcyldKQogIApgYGAKCmBgYHtyfQpBU1ZzVG9WaWV3CmBgYAoKCgpgYGB7cn0Kbm9uU3Bpa2VzMjBDICU+JSAKICByaWdodF9qb2luKEFTVnNUb1ZpZXcsIGJ5ID0gYygiQVNWIiA9ICJ0b3BBU1YiLCAiY2x1c3RlciIpKSAlPiUKICBncm91cF9ieShBU1YpICU+JQogIHNsaWNlX2hlYWQoKQpgYGAKCgoKCgpgYGB7ciBmaWcud2lkdGggPSAxMH0Kbm9uU3Bpa2VzMjBDICU+JQogIHJpZ2h0X2pvaW4oQVNWc1RvVmlldywgYnkgPSBjKCJBU1YiID0gInRvcEFTViIsICJjbHVzdGVyIiA9ICJjbHVzdGVyIikpICU+JQogIGZpbHRlcihjbHVzdGVyIDw9IDcsIERlcHRoICVpbiUgYygiU3VyZmFjZSIsICJCb3R0b20iKSwgIWlzLm5hKERlcHRoKSkgJT4lCiAgYXJyYW5nZShTaXplX0NsYXNzKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBjb3BpZXNQZXJML0Jpbl9TaXplLCB4ID0gU2l6ZV9DbGFzcywgZmlsbCA9IGFzLmZhY3RvcihTdGF0aW9uKSwgc2hhcGUgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfeV9sb2cxMG5pY2UoKSArIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBmYWNldF9ncmlkKERlcHRoIH4gVGFnKSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHJlcCgyMToyNSwgMikpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikKYGBgCkZpZyBYLiBDb3BpZXMgcGVyIEwKCmBgYHtyIGZpZy53aWR0aCA9IDEwfQpub25TcGlrZXMyMEMgJT4lCiAgcmlnaHRfam9pbihBU1ZzVG9WaWV3LCBieSA9IGMoIkFTViIgPSAidG9wQVNWIiwgImNsdXN0ZXIiID0gImNsdXN0ZXIiKSkgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPD0gNywgRGVwdGggJWluJSBjKCJTdXJmYWNlIiwgIkJvdHRvbSIpLCAhaXMubmEoRGVwdGgpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKE1hc3NwZXJMaXRlcikpICU+JQogIGFycmFuZ2UoU2l6ZV9DbGFzcykgJT4lCiAgZ2dwbG90KGFlcyh5ID0gY29waWVzUGVyTC9NYXNzcGVyTGl0ZXIsIHggPSBTaXplX0NsYXNzLCBmaWxsID0gYXMuZmFjdG9yKFN0YXRpb24pLCBzaGFwZSA9IGFzLmZhY3RvcihTdGF0aW9uKSkpICsKICBzY2FsZV95X2xvZzEwbmljZSgpICsgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIGZhY2V0X2dyaWQoRGVwdGggfiBUYWcpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IGFzLmZhY3RvcihTdGF0aW9uKSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKQpgYGAKRmlnIFggKyAxLiBDb3BpZXMgcGVyIG1nIHN0dWZmLgpJIGRvbid0IGxvdmUgdGhlc2UgZXhhbXBsZXMgYmVjYXVzZSB0aGVyZSBpcyBhIGJ1bmNoIG9mIHN0YXRpb24gdG8gc3RhdGlvbiBhcmlhbmNlLCBhbmQgeW91IG5ldmVyIHNlZSB0aGluZ3MgdGhhdCBsaWtlLCBhbHdheXMgc2hvdyB1cCBhdCBsYXJnZSBzdGF0aW9ucy4KCkkgd29uZGVyIGlmIEkgY2FuIGZpbmQgc29tZSBnb29kIGV4YW1wbGVzIG9mIGNvbnNpc3RhbnRseSBsYXJnZSBwYXJ0aWNsZSBzdHVmZiBvciBzb21ldGhpbmcuCgojIFdoYXQgaWYKSSBsb29rIGZvciB0aGluZ3MgdGhhdCBoYXZlIGhpZ2ggcG9zaXRpdmUgc2xvcGUgY29lZmZpY2llbnRzIGJldHdlZW4gc2l6ZSBhbmQgbm9ybWFsaXplZCBjb3BpZXMgcGVyIEwuCkFuZCBzZWxlY3QgZm9yIGhpZ2ggbWVhbiBhYnVuZGFuY2UgYW5kIGhpZ2ggc2xvcGUuCkFuZCB1c2Ugc2l0ZSBhcyBhIHJhbmRvbSBlZmZlY3Q/CldvdWxkIGJlIG5pY2UgdG8gaGF2ZSBzb21lIHRoaW5ncyB0aGF0IGFyZSBpbnRlcm1lZGlhdGVseSBoaWdoIHRob3VnaC4KU29tZSBzb3J0IG9mIHBvbHlub21pYWwgcmVncmVzc2lvbj8KCmBgYHtyfQpuZXN0MjAgPC0gbm9uU3Bpa2VzMjAgJT4lCiAgc2VsZWN0KEFTViwgU3RhdGlvbjpQYXJ0aWNsZXNQZXJMaXRlciwgY29waWVzUGVyTCkgJT4lCiAgbXV0YXRlKFN0YXRpb24gPSBhcy5mYWN0b3IoU3RhdGlvbikpICU+JQogIGdyb3VwX2J5KEFTVikgJT4lCiAgbmVzdCgpCmBgYAoKYGBge3J9ClRlc3RTdWIgPC0gbmVzdDIwW1syXV1bWzFdXSAlPiUgdW5ncm91cCgpClRlc3RTdWIKYGBgCgpgYGB7cn0KbGlicmFyeShsbWU0KQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGJyb29tLm1peGVkKQpgYGAKCmBgYHtyfQpsbShsb2coY29waWVzUGVyTC9CaW5fU2l6ZSkgfiBsb2coU2l6ZV9DbGFzcyksIGRhdGEgPSBUZXN0U3ViKSAlPiUgdGlkeSgpCmBgYAoKYGBge3J9CmxtZXIobG9nKGNvcGllc1BlckwvQmluX1NpemUpIH4gbG9nKFNpemVfQ2xhc3MpICsgKFNpemVfQ2xhc3N8U3RhdGlvbikgKyAoU2l6ZV9DbGFzc3xEZXB0aCkgLCBkYXRhID0gVGVzdFN1YiAlPiUgCiAgICAgICBtdXRhdGUoYXMuZmFjdG9yKFN0YXRpb24pKSkgJT4lIEFJQygpCgpsbWVyKGxvZyhjb3BpZXNQZXJML0Jpbl9TaXplKSB+IGxvZyhTaXplX0NsYXNzKSArICgxfFN0YXRpb24pICsgKDF8RGVwdGgpICwgZGF0YSA9IFRlc3RTdWIgJT4lIAogICAgICAgbXV0YXRlKGFzLmZhY3RvcihTdGF0aW9uKSkpICU+JSBBSUMoKSAjIEJldHRlcgpgYGAKCmBgYHtyfQptb2REZiA8LSBuZXN0MjAgJT4lCiAgbXV0YXRlKG1vZCA9IG1hcChkYXRhLCAKICAgICAgICAgICAgICAgICAgIH5sbWVyKGxvZygoY29waWVzUGVyTCsxKS9CaW5fU2l6ZSkgfiBsb2coU2l6ZV9DbGFzcykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAoU2l6ZV9DbGFzc3xTdGF0aW9uKSArIChTaXplX0NsYXNzfERlcHRoKSwgZGF0YSA9IC4pCiAgKQogICkKYGBgCgpgYGB7cn0KbW9kRGYwMSA8LSBtb2REZiAlPiUgCiAgbXV0YXRlKHRpZGllZCA9IG1hcChtb2QsIHRpZHkpKSAlPiUKICB1bm5lc3QodGlkaWVkKSAlPiUKICBzZWxlY3QoLWRhdGEsIC1tb2QpCmBgYAoKYGBge3J9Cm1vZERmMDIgPC0gbW9kRGYwMSAlPiUKICBmaWx0ZXIodGVybSA9PSAibG9nKFNpemVfQ2xhc3MpIikgJT4lCiAgc2VsZWN0KEFTViwgZXN0aW1hdGUsIHN0ZC5lcnJvcikKYGBgCgpgYGB7cn0KbW9kRGYwMiAlPiUKICBnZ3Bsb3QoYWVzKHggPSBlc3RpbWF0ZSkpICsgZ2VvbV9oaXN0b2dyYW0oKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcShmcm9tID0gLTQsIHRvID0gMiwgYnkgPSAxKSkKYGBgClRoZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGFyZSBvcmUgYWJ1bmRhbnQgaW4gdGhlIGxhcmdlIHBhcnRpY2xlcwoKU28gTWFueSBBU1ZzLiBIb3cgZG8gSSBJRCB0aGUgb25lcyBJIHdhbnQ/CgpJIGtpbmQgb2Ygd2FudCB0byBsb29rIGF0IGF2ZXJhZ2UgY29uY2VudHJhdGlvbnMgKG9yIHN1bXMpCgpgYGB7cn0KU2xvcGVzQW5kTWVhbnMgPC0gbm9uU3Bpa2VzMjAgJT4lCiAgI2ZpbHRlcihLaW5nZG9tID09ICJCYWN0ZXJpYSIpICU+JQogIGdyb3VwX2J5KEFTVikgJT4lCiAgc3VtbWFyaXNlKG1lYW5Db3BpZXMgPSBtZWFuKGNvcGllc1BlckwpKSAlPiUKICBsZWZ0X2pvaW4obW9kRGYwMiwgYnkgPSAiQVNWIikKU2xvcGVzQW5kTWVhbnMgJT4lIGhlYWQoKQpgYGAKCmBgYHtyfQpTbG9wZXNBbmRNZWFucyAlPiUKICBmaWx0ZXIoZXN0aW1hdGUgPj0gMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZXN0aW1hdGUsIHkgPSBtZWFuQ29waWVzLCBsYWJlbCA9IEFTVikpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGFiZWxfcmVwZWwoKQpgYGAKQVNWIDEzIGxvb2tzIHByb21pc2luZwoKYGBge3J9CnRheGEgJT4lIAogIGZpbHRlcihBU1YgJWluJSBjKCJBU1ZfMTMiLCAiQVNWXzIzIiwgIkFTVl81OCIpKQpgYGAKClRoZSBiaWcgc3R1ZmYgYXJlIGFsbCBjeWFub3MhIEh1aC4KCmBgYHtyfQpUYXJnZXRzIDwtIFNsb3Blc0FuZE1lYW5zICU+JSBmaWx0ZXIoZXN0aW1hdGUgPiAwLCBtZWFuQ29waWVzID4gMWU1KSAlPiUgcHVsbChBU1YpCnRheGEgJT4lCiAgZmlsdGVyKEFTViAlaW4lIFRhcmdldHMpCmBgYAoKYGBge3J9CkhvcnNlcyA8LSBTbG9wZXNBbmRNZWFucyAlPiUgCiAgbGVmdF9qb2luKHRheGEsIGJ5ID0gIkFTViIpICU+JQogIGZpbHRlcihlc3RpbWF0ZSA+IDAsIG1lYW5Db3BpZXMgPiAwZTUpICU+JQogIGFycmFuZ2UoLW1lYW5Db3BpZXMpCkhvcnNlcwpgYGAKCk9rLiBCaWcgc3R1ZmYgYXJlIGN5YW5vcyBhbmQgUGxhbmN0b215Y2V0ZXMsIGFuZCBhcHBhcmVudGx5IFNwaWRlcnMuCkFsc28gYXBwYXJlbnRseSBzb21lIHByb3Rlb3Mgb2YgZGlmZmVyZW50IHN0cmlwZXMuIFJob2RvYmFjdGVyIGFyZSBjb29sIHRob3VnaC4KCmBgYHtyIGZpZy53aWR0aCA9IDEwfQpub25TcGlrZXMyMCAlPiUKICBsZWZ0X2pvaW4oU2xvcGVzQW5kTWVhbnMsIGJ5ID0gIkFTViIpICU+JQogIGZpbHRlcihlc3RpbWF0ZSA+IDAsIG1lYW5Db3BpZXMgPiAxZTUsIERlcHRoICE9ICJPeHkiKSAlPiUKICBhcnJhbmdlKC1tZWFuQ29waWVzLCBTaXplX0NsYXNzKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBjb3BpZXNQZXJML0Jpbl9TaXplLCB4ID0gU2l6ZV9DbGFzcywgZmlsbCA9IGFzLmZhY3RvcihTdGF0aW9uKSwgc2hhcGUgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfeV9sb2cxMG5pY2UoKSArIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBmYWNldF9ncmlkKERlcHRoIH4gVGFnKSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoU3RhdGlvbikpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHJlcCgyMToyNSwgMikpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQpgYGAKCmBgYHtyIGZpZy53aWR0aCA9IDEwfQpub25TcGlrZXMyMCAlPiUKICBsZWZ0X2pvaW4oU2xvcGVzQW5kTWVhbnMsIGJ5ID0gIkFTViIpICU+JQogIGZpbHRlcihlc3RpbWF0ZSA+IDAsIG1lYW5Db3BpZXMgPiAxZTUsIERlcHRoICE9ICJPeHkiKSAlPiUKICBhcnJhbmdlKC1tZWFuQ29waWVzLCBTaXplX0NsYXNzKSAlPiUKICBmaWx0ZXIoQVNWID09ICJBU1ZfNyIpICU+JQogIGdncGxvdChhZXMoeSA9IGNvcGllc1BlckwvQmluX1NpemUsIHggPSBTaXplX0NsYXNzLCBmaWxsID0gYXMuZmFjdG9yKFN0YXRpb24pLCBzaGFwZSA9IGFzLmZhY3RvcihTdGF0aW9uKSkpICsKICBzY2FsZV95X2xvZzEwbmljZSgpICsgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIGZhY2V0X2dyaWQoRGVwdGggfiBUYWcpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IGFzLmZhY3RvcihTdGF0aW9uKSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCmBgYAoKYGBge3IgZmlnLndpZHRoID0gMTB9Cm5vblNwaWtlczIwICU+JQogIGxlZnRfam9pbihTbG9wZXNBbmRNZWFucywgYnkgPSAiQVNWIikgJT4lCiAgZmlsdGVyKGVzdGltYXRlID4gMCwgbWVhbkNvcGllcyA8IDFlNSwgRGVwdGggIT0gIk94eSIpICU+JQogIGFycmFuZ2UoLW1lYW5Db3BpZXMsIFNpemVfQ2xhc3MpICU+JQogIGdncGxvdChhZXMoeSA9IGNvcGllc1BlckwvQmluX1NpemUsIHggPSBTaXplX0NsYXNzLCBmaWxsID0gYXMuZmFjdG9yKFN0YXRpb24pLCBzaGFwZSA9IGFzLmZhY3RvcihTdGF0aW9uKSkpICsKICBzY2FsZV95X2xvZzEwbmljZSgpICsgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIGZhY2V0X2dyaWQoRGVwdGggfiBUYWcpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IGFzLmZhY3RvcihTdGF0aW9uKSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCmBgYAoKTGV0cyBsb29rIGF0IHRoZXNlIQoKSSBsaWtlLCBhcyBleGFtcGxlcyBQYXJhY29jY3VzIChhIFJob2RvYmFjdGVyKSAtQVNWXzQ1OQpTeW5lY2hvY29jY3VzX0NDOTkwMiAtLSBBU1ZfMjMKU0FSMTFfQ2xhZGUgLS0gQVNWXzMKCmBgYHtyfQpub25TcGlrZXMyMCAlPiUKICBmaWx0ZXIoQVNWICVpbiUgYygiQVNWXzMiLCAiQVNWXzIzIiwgIkFTVl80NTkiKSwgRGVwdGggIT0gIk94eSIpICU+JQogIGFycmFuZ2UoU2l6ZV9DbGFzcykgJT4lCiAgZ2dwbG90KGFlcyh5ID0gY29waWVzUGVyTC9CaW5fU2l6ZSwgeCA9IFNpemVfQ2xhc3MsIGZpbGwgPSBhcy5mYWN0b3IoU3RhdGlvbiksIHNoYXBlID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3lfbG9nMTBuaWNlKG9tYWcgPSBzZXEoLTEwLCAyMCwgYnkgPSAyKSkgKyBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgZmFjZXRfZ3JpZChEZXB0aCB+IFRhZykgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gYXMuZmFjdG9yKFN0YXRpb24pKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHkgPSAiMTZzIENvcGllcy9ML21tIiwgeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSksIGZpbGwgPSAiU3RhdGlvbiIsIGNvbG9yID0gIlN0YXRpb24iLCBzaGFwZSA9ICJTdGF0aW9uIikKYGBgCgoKCiMgTW9kdWxlIGFidW5kYW5jZSBwbG90CgpgYGB7cn0KaGdyb3Vwc19hbnRzIDwtIGN1dHJlZShzY2x1c3QsIGsgPSA1MCkKYGBgCgoKYGBge3J9Cm5vblNwaWtlczIwQSA8LSBub25TcGlrZXMyMCAlPiUgbGVmdF9qb2luKAogIHRpYmJsZShBU1YgPSBuYW1lcyhoZ3JvdXBzX2FudHMpLCBjbHVzdGVyID0gaGdyb3Vwc19hbnRzKSwgYnkgPSAiQVNWIikKIyBBU1ZzVG9WaWV3IDwtIG5vblNwaWtlczIwQSAlPiUKIyAgIGZpbHRlcihLaW5nZG9tID09ICJCYWN0ZXJpYSIpICU+JQojICAgZ3JvdXBfYnkoQVNWLCBjbHVzdGVyKSAlPiUKIyAgIHN1bW1hcmlzZShtZWFuQ29waWVzID0gbWVhbihjb3BpZXNQZXJMKSkgJT4lCiMgICBncm91cF9ieShjbHVzdGVyKSAlPiUKIyAgIHN1bW1hcml6ZSh0b3BBU1YgPSBBU1Zbd2hpY2gubWF4KG1lYW5Db3BpZXMpXSkKICAKYGBgCgpgYGB7cn0KQ2x1c3RlclN1bXNBIDwtIG5vblNwaWtlczIwQSAlPiUKICBncm91cF9ieShTdGF0aW9uLCBEZXB0aCwgY2x1c3RlciwgU2l6ZV9DbGFzcywgQmluX1NpemUpICU+JQogIHN1bW1hcmlzZShjb3BpZXNQZXJMID0gc3VtKGNvcGllc1BlckwpKQpgYGAKCgpgYGB7cn0KSHVnZVN1cmZhY2VQbG90IDwtIG5vblNwaWtlczIwQSAlPiUKICBmaWx0ZXIoRGVwdGggPT0gIlN1cmZhY2UiKSAlPiUKICBhcnJhbmdlKEJpbl9TaXplKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBjb3BpZXNQZXJML0Jpbl9TaXplLCB4ID0gU2l6ZV9DbGFzcykpICsKICBmYWNldF9ncmlkKGNsdXN0ZXIgfiBTdGF0aW9uKSArCiAgc2NhbGVfeV9sb2cxMG5pY2Uob21hZyA9IHNlcSgtMTAsIDIwLCBieSA9IDQpKSArIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBnZW9tX3BhdGgoYWxwaGEgPSAwLjUsIGFlcyhncm91cCA9IEFTVikpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHkgPSAiMTZzIENvcGllcy9ML21tIiwgeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSksIGZpbGwgPSAiU3RhdGlvbiIsIGNvbG9yID0gIlN0YXRpb24iLCBzaGFwZSA9ICJTdGF0aW9uIikgKwogIGdlb21fcGF0aChjb2xvciA9ICJyZWQiLCBkYXRhID0gQ2x1c3RlclN1bXNBICU+JSBmaWx0ZXIoRGVwdGggPT0gIlN1cmZhY2UiKSkgIyBBZGQgc3VtcwpnZ3NhdmUoIkh1Z2VTdXJmYWNlUGxvdC5wZGYiLCBIdWdlU3VyZmFjZVBsb3QsIGhlaWdodCA9IDcyLCB3aWR0aCA9IDgsIGxpbWl0c2l6ZSA9IEZBTFNFKQpgYGAKCkkgdGhpbmsgd2UncmUgdXNpbmcgImludGVyY2VwdCIgaW4gdGhlIGNsdXN0ZXJpbmcgaW5mb3JtYXRpb24gc29tZWhvdy4gV2hpY2ggSSBkb24ndCBwYXJ0aWN1bGFybHkgd2FudC4gQnV0IHRoZSBjbHVzdGVyaW5nIGRvZXMgaGFwcGVuIGJ5IGNvcnJlbGF0aW9uLiBTdXBlciBzdHJhbmdlLiBNYXliZSB0aGUgY29ycmVsYXRpb24gaXNuJ3QgdGhlIHdheSBJIHRoaW5rIGl0IGlzPwoKYGBge3J9Ck1pbmltYWxTdXJmYWNlUGxvdCA8LSBub25TcGlrZXMyMEEgJT4lCiAgZmlsdGVyKERlcHRoID09ICJTdXJmYWNlIiwgY2x1c3RlciAlaW4lIGMoMSwgNywgMTUpKSAlPiUKICBhcnJhbmdlKEJpbl9TaXplKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBjb3BpZXNQZXJML0Jpbl9TaXplLCB4ID0gU2l6ZV9DbGFzcykpICsKICBmYWNldF9ncmlkKGNsdXN0ZXJ+IFN0YXRpb24pICsKICBzY2FsZV95X2xvZzEwbmljZShvbWFnID0gc2VxKC0xMCwgMjAsIGJ5ID0gMikpICsgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIGdlb21fcGF0aChhbHBoYSA9IDAuNSwgYWVzKGdyb3VwID0gQVNWKSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE0KSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnMoeSA9ICIxNnMgQ29waWVzL0wvbW0iLCB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSwgZmlsbCA9ICJTdGF0aW9uIiwgY29sb3IgPSAiU3RhdGlvbiIsIHNoYXBlID0gIlN0YXRpb24iKSArCiAgZ2VvbV9wYXRoKGNvbG9yID0gInJlZCIsIGRhdGEgPSBDbHVzdGVyU3Vtc0EgJT4lIGZpbHRlcihEZXB0aCA9PSAiU3VyZmFjZSIsIGNsdXN0ZXIgJWluJSBjKDEsIDcsIDE1KSkpICMgQWRkIHN1bXMKZ2dzYXZlKCJNaW5pbWFsU3VyZmFjZVBsb3QucGRmIiwgTWluaW1hbFN1cmZhY2VQbG90LCBoZWlnaHQgPSAxMSwgd2lkdGggPSA4LCBsaW1pdHNpemUgPSBGQUxTRSkKYGBgCgpgYGB7cn0KTWluaW1hbFN1cmZhY2VQbG90CmBgYAoKCmBgYHtyfQpNaW5pbWFsQ2x1c3RlclBsb3QgPC0gbm9uU3Bpa2VzMjBBICU+JQogIGZpbHRlcihEZXB0aCAhPSAiT3h5IiwgY2x1c3RlciAlaW4lIGMoMSwgNywgMTUpKSAlPiUKICBhcnJhbmdlKEJpbl9TaXplKSAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBjb3BpZXNQZXJML0Jpbl9TaXplLCB4ID0gU2l6ZV9DbGFzcykpICsKICBmYWNldF9ncmlkKGNsdXN0ZXIgKyBEZXB0aCB+IFN0YXRpb24pICsKICBzY2FsZV95X2xvZzEwbmljZShvbWFnID0gc2VxKC0xMCwgMjAsIGJ5ID0gMikpICsgc2NhbGVfeF9sb2cxMChicmVha3MgPSBteV9zaXplcywgbGFiZWxzID0gYXMuY2hhcmFjdGVyKG15X3NpemVzKSkgKwogIGdlb21fcGF0aChhbHBoYSA9IDAuNSwgYWVzKGdyb3VwID0gQVNWKSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE0KSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnMoeSA9ICIxNnMgQ29waWVzL0wvbW0iLCB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUGFydGljbGUgU2l6ZSAoIiwgbXUsICJtKSIpKSwgZmlsbCA9ICJTdGF0aW9uIiwgY29sb3IgPSAiU3RhdGlvbiIsIHNoYXBlID0gIlN0YXRpb24iKSArCiAgZ2VvbV9wYXRoKGNvbG9yID0gInJlZCIsIGRhdGEgPSBDbHVzdGVyU3Vtc0EgJT4lIGZpbHRlcihEZXB0aCAhPSAiT3h5IiwgY2x1c3RlciAlaW4lIGMoMSwgNywgMTUpKSkgIyBBZGQgc3VtcwpnZ3NhdmUoIk1pbmltYWxDbHVzdGVyUGxvdC5wZGYiLCBNaW5pbWFsQ2x1c3RlclBsb3QsIGhlaWdodCA9IDExLCB3aWR0aCA9IDgsIGxpbWl0c2l6ZSA9IEZBTFNFKQpgYGAKCgojIEZvciBzYWlyYWggc3BlY2lmaWNhbGx5CgpgYGB7cn0KRXhhbXBsZVRheGEgPC0gbm9uU3Bpa2VzMjAgJT4lCiAgZmlsdGVyKEFTViAlaW4lIGMoIkFTVl8zIiwgIkFTVl8yMyIsICJBU1ZfNDU5IikpICU+JQogIGZpbHRlcihTdGF0aW9uICVpbiUgYygiMy4zIiwgIjQuMyIpKSAlPiUKICBtdXRhdGUoRGVwdGggPSByZWNvZGUoRGVwdGgsIE94eSA9ICJPeHljbGluZSIpKSAlPiUKICBhcnJhbmdlKFNpemVfQ2xhc3MpICU+JQogIGdncGxvdChhZXMoeSA9IGNvcGllc1BlckwvQmluX1NpemUsIHggPSBTaXplX0NsYXNzLCBmaWxsID0gYXMuZmFjdG9yKERlcHRoKSwgc2hhcGUgPSBhcy5mYWN0b3IoRGVwdGgpKSkgKwogIHNjYWxlX3lfbG9nMTBuaWNlKG9tYWcgPSBzZXEoLTEwLCAyMCwgYnkgPSAyKSkgKyBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgZmFjZXRfZ3JpZChTdGF0aW9uIH4gVGFnKSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoRGVwdGgpKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSByZXAoMjE6MjUsIDIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JlZW4iLCAiYmx1ZSIsICJibGFjayIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImdyZWVuIiwgImJsdWUiLCAiYmxhY2siKSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE0KSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsKICBsYWJzKHkgPSAiMTZzIENvcGllcy9ML21tIiwgeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSksIGZpbGwgPSAiU3RhdGlvbiIsIGNvbG9yID0gIlN0YXRpb24iLCBzaGFwZSA9ICJTdGF0aW9uIikKRXhhbXBsZVRheGEKYGBgCgojIyMgVGhpbmcgMgoKCmBgYHtyfQphYnVuUGxvdDAgPC0gbWljcm9iaWFsQWJ1bmRhbmNlICU+JSAKICBmaWx0ZXIoaXMuZmluaXRlKE1hc3NwZXJMaXRlcikpICU+JQogICNmaWx0ZXIoRGVwdGggJWluJSBjKCJTdXJmYWNlIiwgIkJvdHRvbSIpKSAlPiUKICBmaWx0ZXIoU3RhdGlvbiAlaW4lIGMoMy4zLCA0LjMpKSAlPiUKICBtdXRhdGUoRGVwdGggPSByZWNvZGUoRGVwdGgsIE94eSA9ICJPeHljbGluZSIpKSAlPiUKICBtdXRhdGUoY29waWVzUGVyTWcgPSBjb3BpZXNQZXJMIC8gTWFzc3BlckxpdGVyKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBTaXplX0NsYXNzLCB5ID0gY29waWVzUGVyTWcsIHNoYXBlID0gYXMuZmFjdG9yKERlcHRoKSwgZmlsbCA9IGFzLmZhY3RvcihEZXB0aCkpKSArCiAgZmFjZXRfd3JhcCh+U3RhdGlvbiwgbmNvbCA9IDEpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICAjZ2VvbV9wYXRoKCkgKyAKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gYXMuZmFjdG9yKERlcHRoKSkpICsKICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgc2NhbGVfeV9sb2cxMG5pY2UoKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHJlcCgyMToyNSwgMikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmVlbiIsICJibHVlIiwgImJsYWNrIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JlZW4iLCAiYmx1ZSIsICJibGFjayIpKSArCiAgbGFicyh5ID0gIjE2cyArIDE4cyBHZW5lcyAvIG1nIFBhcnRpY2xlcyIsIHggPSBleHByZXNzaW9uKHBhc3RlKCJQYXJ0aWNsZSBTaXplICgiLCBtdSwgIm0pIikpLCBjb2xvciA9ICJEZXB0aCIsIGZpbGwgPSAiRGVwdGgiLCBzaGFwZSA9ICJEZXB0aCIpICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLCAwLCAwLCAwKSwgImNtIiksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gLjUpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJtbSIpLCB2anVzdCA9IDApKQpTYWlyYWhMZWdlbmQgPC0gZ2V0X2xlZ2VuZChhYnVuUGxvdDApCmFidW5QbG90IDwtIGFidW5QbG90MCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKI2FidW5QbG90CmBgYAoKYGBge3J9ClBQTFBsb3QgPC0gbWljcm9iaWFsQWJ1bmRhbmNlICU+JQogIGZpbHRlcihTaXplX0NsYXNzID49IDEpICU+JQogICNmaWx0ZXIoRGVwdGggJWluJSBjKCJTdXJmYWNlIiwgIkJvdHRvbSIpKSAlPiUKICBmaWx0ZXIoU3RhdGlvbiAlaW4lIGMoMy4zLCA0LjMpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBTaXplX0NsYXNzLCB5ID0gUGFydGljbGVzUGVyTGl0ZXIsIHNoYXBlID0gYXMuZmFjdG9yKERlcHRoKSwgZmlsbCA9IGFzLmZhY3RvcihEZXB0aCkpKSArCiAgZmFjZXRfd3JhcCh+U3RhdGlvbiwgbmNvbCA9IDEpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICAjZ2VvbV9wYXRoKCkgKyAKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gYXMuZmFjdG9yKERlcHRoKSkpICsKICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IG15X3NpemVzLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIobXlfc2l6ZXMpKSArCiAgc2NhbGVfeV9sb2cxMG5pY2Uob21hZz1zZXEoLTEwLDIwLCBieSA9IDIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHJlcCgyMToyNSwgMikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmVlbiIsICJibHVlIiwgImJsYWNrIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JlZW4iLCAiYmx1ZSIsICJibGFjayIpKSArCiAgbGFicyh5ID0gIlBhcnRpY2xlcy9ML21tIiwgeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IC41KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAibW0iKSwgdmp1c3QgPSAwKSkKI1BQTFBsb3QKCgpgYGAKCmBgYHtyfQpQYXJ0aWNsZU1hc3NQbG90IDwtIG1pY3JvYmlhbEFidW5kYW5jZSAlPiUKICBmaWx0ZXIoU2l6ZV9DbGFzcyA+PSAxKSAlPiUKICAjZmlsdGVyKERlcHRoICVpbiUgYygiU3VyZmFjZSIsICJCb3R0b20iKSkgJT4lCiAgZmlsdGVyKFN0YXRpb24gJWluJSBjKDMuMywgNC4zKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gU2l6ZV9DbGFzcywgeSA9IE1hc3NwZXJMaXRlci9QYXJ0aWNsZXNQZXJMaXRlciwgc2hhcGUgPSBhcy5mYWN0b3IoRGVwdGgpLCBmaWxsID0gYXMuZmFjdG9yKERlcHRoKSkpICsKICBmYWNldF93cmFwKH5TdGF0aW9uLCBuY29sID0gMSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogICNnZW9tX3BhdGgoKSArIAogIGdlb21fcGF0aChhZXMoY29sb3IgPSBhcy5mYWN0b3IoRGVwdGgpKSkgKwogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gbXlfc2l6ZXMsIGxhYmVscyA9IGFzLmNoYXJhY3RlcihteV9zaXplcykpICsKICBzY2FsZV95X2xvZzEwbmljZShvbWFnID0gc2VxKC0xMCwgMjAsIGJ5ID0gMikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gcmVwKDIxOjI1LCAyKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImdyZWVuIiwgImJsdWUiLCAiYmxhY2siKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmVlbiIsICJibHVlIiwgImJsYWNrIikpICsKICBsYWJzKHkgPSAiRHJ5IE1hc3MgKG1nKSAvIFBhcnRpY2xlIiwgeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBhcnRpY2xlIFNpemUgKCIsIG11LCAibSkiKSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMCwgMCwgMCwgMCksICJjbSIpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IC41KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAibW0iKSwgdmp1c3QgPSAuNSkpCiNQYXJ0aWNsZU1hc3NQbG90CmBgYAoKYGBge3J9CnguZ3JvYiA8LSB0ZXh0R3JvYihleHByZXNzaW9uKHBhc3RlKCJQYXJ0aWNsZSBTaXplICgiLCBtdSwgIm0pIikpLCAKICAgICAgICAgICAgICAgICAgIGdwPWdwYXIoZm9udHNpemU9MTYpKQpgYGAKCgpgYGB7ciBmaWcuaGVpZ2h0ID0gNCwgZmlnLndpZHRoID0gMTF9CmNvbWJpbmVkUGxvdCA8LSBwbG90X2dyaWQoUFBMUGxvdCwgUGFydGljbGVNYXNzUGxvdCwgYWJ1blBsb3QsIG5yb3cgPSAxLCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIpKQpgYGAKCmBgYHtyfQptZXRhMiA8LSBncmlkLmFycmFuZ2UoYXJyYW5nZUdyb2IoY29tYmluZWRQbG90LCBib3R0b20gPSB4Lmdyb2IpLCByaWdodCA9IFNhaXJhaExlZ2VuZCkKYGBg